package com.spgf.model.rn;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import android.content.Context;

import com.archtecture.model.exceptions.NegocioException;
import com.spgf.model.dao.CategoriaDAO;
import com.spgf.model.entities.Categoria;
import com.spgf.model.entities.Lancamento;
import com.spgf.model.enums.Mes;
import com.spgf.model.enums.TipoCategoria;

public class CategoriaRN {

	private final Context	context;

	public CategoriaRN(final Context context) {
		this.context = context;
	}

	public void insert(final Categoria pCategoria) throws NegocioException {
		new CategoriaDAO(context).executeInsert(pCategoria);
	}

	public Categoria find(Categoria pCategoria) throws NegocioException {
		return new CategoriaDAO(context).executeFind(pCategoria);
	}

	public List<Categoria> findAll(Categoria pCategoria) throws NegocioException {
		return executarFindAll(pCategoria);
	}

	public List<Categoria> obterResumoMensalCategorias(Mes mes, String lAno) throws NegocioException {

		Categoria lCategoria = new Categoria();
		lCategoria.setTipo(TipoCategoria.DEBITO);
		List<Categoria> lListCategorias = executarFindAll(lCategoria);

		final Calendar cal = Calendar.getInstance();
		cal.set(Calendar.MONTH, mes.ordinal());
		cal.set(Calendar.YEAR, Integer.valueOf(lAno));

		List<Categoria> lListCategoriasFinal = new ArrayList<Categoria>();

		for (Categoria lCategoriaTemp : lListCategorias) {

			Lancamento lLancamento = new Lancamento();
			lLancamento.setData(cal.getTime());
			lLancamento.setCategoria(lCategoriaTemp);

			final List<Lancamento> lListLancamentos = new LancamentoRN(context).executarFindAll(lLancamento);

			Double lValorTotal = 0D;

			for (Lancamento lLancamentoTemp : lListLancamentos) {
				lValorTotal += lLancamentoTemp.getValor();
			}

			lCategoriaTemp.setValorTotal(lValorTotal);

			if (lCategoriaTemp.getValorTotal() > 0D) {
				lListCategoriasFinal.add(lCategoriaTemp);
			}
		}

		return lListCategoriasFinal;

	}

	public List<Categoria> executarFindAll(Categoria model) throws NegocioException {

		StringBuilder lSb = new StringBuilder();

		if (model.getCodigo() != null) {
			lSb.append(CategoriaDAO.COLUNA_CODIGO + " = " + model.getCodigo());
		}

		if (model.getNome() != null) {

			if (lSb.length() > 0) {
				lSb.append(" AND ");
			}

			lSb.append(CategoriaDAO.COLUNA_NOME + " = '" + model.getNome() + "'");
		}

		return new CategoriaDAO(context).executeFindAll(model, null, lSb.toString());
	}

}
